package com.dys.service.impl;

import com.dys.service.AService;
import com.dys.service.BService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

/**
 * @className: com.dys.service.impl.BServiceImpl
 * @description: com.dys.service.impl
 * @author: pine cone
 * @version: v1.0.0
 * @createTime: 2024/10/21 23:14
 */
@Service
public class BServiceImpl implements BService {

    @Autowired
    private AService aService;

    /**
     * 该方法中的事务管理：合并到一个事务里？还是开启一个新的事务？
     * 七种传播行为：
     * 1.REQUIRED：支持当前事务，如果不存在就新建一个(默认)【没有就新建，有就加入】
     * 2.SUPPORTS：支持当前事务，如果当前没有事务，就以非事务方式执行【有就加入，没有就不管了】
     * 3.* MANDATORY：必须运行在一个事务中，如果当前没有事务正在发生，将抛出一个异常【有就加入，没有就抛异常】
     * 4.REQUIRES_NEW：开启一个新的事务，如果一个事务已经存在，则将这个存在的事务挂起【不管有没有，直接开启一个新事务，开启的新事务和之前的事务不存在嵌套关系，之前事务被挂起】
     * 5.NOT_SUPPORTED：以非事务方式运行，如果有事务存在，挂起当前事务【不支持事务，存在就挂起】
     * 6.NEVER：以非事务方式运行，如果有事务存在，抛出异常【不支持事务，存在就抛异常】
     * 7.NESTED：如果当前正有一个事务在进行中，则该方法应当运行在一个嵌套式事务中。被嵌套的事务可以独立于外层事务进行提交或回滚。
     * 如果外层事务不存在，行为就像REQUIRED一样。【有事务的话，就在这个事务里再嵌套一个完全独立的事务，
     * 嵌套的事务可以独立的提交和回滚。没有事务就和REQUIRED一样。】
     */
    @Transactional
    @Override
    public void b() {
        System.out.println("事务的传播属性,执行了B方法......");
        // 调用另一个Service的a()方法
        aService.a();
    }
}
